package com.manning.hsia.dvdstore.bridge;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.Field.TermVector;
import org.hibernate.search.bridge.LuceneOptions;
import org.hibernate.search.bridge.TwoWayFieldBridge;
import com.manning.hsia.dvdstore.model.PersonPK;
/**
* two-way bridge storing an embedded id
*
* Example 4.8
*/
public class PersonPkBridge implements TwoWayFieldBridge {
public Object get(String name, Document document) { //build composite identifier from document
PersonPK id = new PersonPK();
Field field = document.getField( name + ".firstName" );
id.setFirstName( field.stringValue() );
field = document.getField( name + ".lastName" );
id.setLastName( field.stringValue() );
return id;
}
public String objectToString(Object object) { //create unique string from identifier
PersonPK id = (PersonPK) object;
StringBuilder sb = new StringBuilder();
sb.append( id.getFirstName() )
.append( " " )
.append( id.getLastName() );
return sb.toString();
}
public void set(String name,
Object value,
Document document,
LuceneOptions luceneOptions) {
PersonPK id = (PersonPK) value;
Store store = luceneOptions.getStore();
Index index = luceneOptions.getIndex();
TermVector termVector = luceneOptions.getTermVector();
Float boost = luceneOptions.getBoost();
Field field = new Field( name + ".firstName", id.getFirstName(), //store each sub property in a field
store, index, termVector );
field.setBoost( boost );
document.add( field );
field = new Field( name + ".lastName", id.getLastName(),
store, index, termVector );
field.setBoost( boost );
document.add( field );
field = new Field( name, objectToString( id ), //store unique representation in named field
store, index, termVector );
field.setBoost( boost );
document.add( field );
}
}